﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace VideoLink.Streams
{
    /// <summary>
    /// Представляет кнопку, которая имеет три состояния.
    /// Каждому состоянию соответствует изображение.
    /// </summary>
    [DefaultEvent("Click")]
    public partial class ImageButton : UserControl
    {
        #region Private fields

        /// <summary>
        /// Текущее состояние кнопки
        /// </summary>
        private ButtonState state = ButtonState.Default;

        /// <summary>
        /// Картинка, которая будет рисоваться на кнопке при State = Default
        /// </summary>
        private Image defaultImg;
        /// <summary>
        /// Картинка, которая будет рисоваться на кнопке при State = Hover
        /// </summary>
        private Image hoverImg;
        /// <summary>
        /// Картинка, которая будет рисоваться на кнопке при State = Clicked
        /// </summary>
        private Image clickedImg;
        
        #endregion

        #region Public properties

        /// <summary>
        /// Текущее состояние кнопки.
        /// При изменении данного свойства контрол автоматически перерисовывается
        /// </summary>
        public ButtonState State
        {
            get
            {
                return state;
            }
            set
            {
                state = value;
                UpdateImg();
            }
        }

        /// <summary>
        /// Картинка, которая будет рисоваться на кнопке при State = Default
        /// </summary>
        public Image DefaultImage
        {
            get
            {
                return defaultImg;
            }
            set
            {
                defaultImg = value;
                UpdateImg();
            }
        }

        /// <summary>
        /// Картинка, которая будет рисоваться на кнопке при State = Hover
        /// </summary>
        public Image HoverImage
        {
            get
            {
                return hoverImg;
            }
            set
            {
                hoverImg = value;
                UpdateImg();
            }
        }

        /// <summary>
        /// Картинка, которая будет рисоваться на кнопке при State = Clicked
        /// </summary>
        public Image ClickedImg
        {
            get
            {
                return clickedImg;
            }
            set
            {
                clickedImg = value;
                UpdateImg();
            }

        }
        
        #endregion

        /// <summary>
        /// Создать экземпляр класса по умолчанию
        /// </summary>
        public ImageButton()
        {
            InitializeComponent();
            picture.SizeMode = PictureBoxSizeMode.StretchImage;
        }

        #region Protected methods

        /// <summary>
        /// Перерисовать кнопку в соответствии с текущим состоянием
        /// </summary>
        protected void UpdateImg()
        {
            switch (state)
            {
                case ButtonState.Default:
                    picture.Image = defaultImg;
                    break;
                case ButtonState.Hover:
                    picture.Image = hoverImg;
                    break;
                case ButtonState.Clicked:
                    picture.Image = clickedImg;
                    break;
            }
        }
        
        #endregion

        #region Event handlers

        /// <summary>
        /// -
        /// </summary>
        /// <param name="sender">-</param>
        /// <param name="e">-</param>
        private void picture_MouseDown(object sender, MouseEventArgs e)
        {
            State = ButtonState.Clicked;
        }

        /// <summary>
        /// -
        /// </summary>
        /// <param name="sender">-</param>
        /// <param name="e">-</param>
        private void picture_MouseUp(object sender, MouseEventArgs e)
        {
            State = ButtonState.Hover;
        }

        /// <summary>
        /// -
        /// </summary>
        /// <param name="sender">-</param>
        /// <param name="e">-</param>
        private void picture_MouseEnter(object sender, EventArgs e)
        {
            State = ButtonState.Hover;
        }

        /// <summary>
        /// -
        /// </summary>
        /// <param name="sender">-</param>
        /// <param name="e">-</param>
        private void picture_MouseLeave(object sender, EventArgs e)
        {
            State = ButtonState.Default;
        }

        /// <summary>
        /// -
        /// </summary>
        /// <param name="sender">-</param>
        /// <param name="e">-</param>
        private void picture_Click(object sender, EventArgs e)
        {
            if (Click != null)
                Click(this, EventArgs.Empty);
        }

        #endregion

        /// <summary>
        /// Вызывается при клике на кнопку
        /// </summary>
        public new event EventHandler Click;

        #region Nested types

        /// <summary>
        /// Представляет текущее состояние кнопки
        /// </summary>
        public enum ButtonState
        {
            /// <summary>
            /// Состояние по умолчанию.
            /// </summary>
            Default,
            /// <summary>
            /// Состояние кнопки, когда мышь над нею
            /// </summary>
            Hover,
            /// <summary>
            /// Состояние кнопки, когда нажата кнопка мыши на кнопке
            /// </summary>
            Clicked
        }
        
        #endregion
    }
}
